import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtil {

    private static HikariDataSource dataSource;

    // 静态代码块：在类加载时执行，用于初始化连接池
    static {
        try {
            // 1. 加载 db.properties 配置文件
            Properties props = new Properties();
            InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
            props.load(in);

            // 2. 创建 HikariConfig 对象并设置属性
            HikariConfig config = new HikariConfig();
            config.setDriverClassName(props.getProperty("jdbc.driver"));
            config.setJdbcUrl(props.getProperty("jdbc.url"));
            config.setUsername(props.getProperty("jdbc.username"));
            config.setPassword(props.getProperty("jdbc.password"));
            config.setMaximumPoolSize(Integer.parseInt(props.getProperty("jdbc.pool.maximumPoolSize")));

            // 3. 使用 config 对象创建 dataSource
            dataSource = new HikariDataSource(config);

            System.out.println("数据库连接池初始化成功！");

        } catch (Exception e) {
            // 如果初始化失败，程序无法运行，抛出运行时异常
            throw new RuntimeException("数据库连接池初始化失败！", e);
        }
    }

    /**
     * 从连接池中获取一个数据库连接
     * @return Connection 对象
     * @throws SQLException 如果获取连接失败
     */
    public static Connection getConnection() throws SQLException {
        // 直接从数据源获取连接
        return dataSource.getConnection();
    }

    // 测试方法：运行此方法，如果控制台打印“连接池初始化成功！”和“获取连接成功！”，则表示配置正确
    public static void main(String[] args) {
        try (Connection conn = DBUtil.getConnection()) {
            System.out.println("获取连接成功！");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}